#include <iostream>
#include <functional>
#include <string>
#include <cassert>
#include <pthread.h>
using namespace std;

class Thread;  // 声明一下
struct Context // 线程上下文类
{
    Thread *_this = nullptr;
    void *_args = nullptr;
};

class Thread
{
public:
    typedef function<void *(void *)> func_t;
    Thread(func_t func, void *args)
        : _func(func), _args(args)
    {

        Context *ctx = new Context();
        ctx->_this = this;
        ctx->_args = args;
        pthread_create(&_tid, nullptr, start_routine, ctx);
        _name = string("thread - ") + to_string(_tid);
    }
    void *run(void *args)
    {
        return _func(args);
    }
    static void *start_routine(void *args)
    {
        Context *ctx = static_cast<Context *>(args);
        void *ret = ctx->_this->run(ctx->_args);
        return ret;
    }
    void join()
    {
        int n = pthread_join(_tid, nullptr);
        assert(n == 0);
        cout << _name << "已退出" << endl;
    }

private:
    string _name;   // 线程名称
    pthread_t _tid; // 线程ID
    func_t _func;   // 回调函数
    void *_args;    // 线程函数参数
};
